package com.ruoyi.training.service.impl;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.training.domain.CertificateField;
import com.ruoyi.training.domain.CertificateTemplate;
import com.ruoyi.training.domain.Projects;
import com.ruoyi.training.dto.certificate.CertificateTemplateDto;
import com.ruoyi.training.mapper.CertificateFieldMapper;
import com.ruoyi.training.mapper.CertificateTemplateMapper;
import com.ruoyi.training.mapper.ProjectsMapper;
import com.ruoyi.training.service.ICertificateTemplateService;
import com.ruoyi.training.util.xuehua.SnowflakeIdUtils;
import com.ruoyi.training.vo.certificate.CertificateTemplateVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 证书模板Service业务层处理
 * 
 * @author hcc
 * @date 2025-11-06
 */
@Service
public class CertificateTemplateServiceImpl implements ICertificateTemplateService
{
    @Autowired
    private CertificateTemplateMapper certificateTemplateMapper;

    @Autowired
    private CertificateFieldMapper certificateFieldMapper;

    @Autowired
    private ProjectsMapper projectsMapper;

    private SnowflakeIdUtils snowflakeIdUtils = new SnowflakeIdUtils(5,8);
    /**
     * 查询证书模板
     * 
     * @param certificateTemplateId 证书模板主键
     * @return 证书模板
     */
    @Override
    public CertificateTemplate selectCertificateTemplateByCertificateTemplateId(String certificateTemplateId)
    {
        return certificateTemplateMapper.selectCertificateTemplateByCertificateTemplateId(certificateTemplateId);
    }

    /**
     * 查询证书模板列表
     * 
     * @param certificateTemplate 证书模板
     * @return 证书模板
     */
    @Override
    public List<CertificateTemplate> selectCertificateTemplateList(CertificateTemplate certificateTemplate)
    {
        return certificateTemplateMapper.selectCertificateTemplateList(certificateTemplate);
    }

    /**
     * 新增证书模板
     * 
     * @param certificateTemplate 证书模板
     * @return 结果
     */
    @Override
    public int insertCertificateTemplate(CertificateTemplate certificateTemplate)
    {
        certificateTemplate.setCertificateTemplateId(String.valueOf(new SnowflakeIdUtils(5,8).nextId()));
        return certificateTemplateMapper.insertCertificateTemplate(certificateTemplate);
    }

    /**
     * 修改证书模板
     * 
     * @param certificateTemplate 证书模板
     * @return 结果
     */
    @Override
    public int updateCertificateTemplate(CertificateTemplate certificateTemplate)
    {
        return certificateTemplateMapper.updateCertificateTemplate(certificateTemplate);
    }

    /**
     * 批量删除证书模板
     * 
     * @param certificateTemplateIds 需要删除的证书模板主键
     * @return 结果
     */
    @Override
    public int deleteCertificateTemplateByCertificateTemplateIds(String[] certificateTemplateIds)
    {
        return certificateTemplateMapper.deleteCertificateTemplateByCertificateTemplateIds(certificateTemplateIds);
    }

    /**
     * 删除证书模板信息
     * 
     * @param certificateTemplateId 证书模板主键
     * @return 结果
     */
    @Override
    public int deleteCertificateTemplateByCertificateTemplateId(String certificateTemplateId)
    {
        return certificateTemplateMapper.deleteCertificateTemplateByCertificateTemplateId(certificateTemplateId);
    }

    /**
     * 新增证书模板
     *
     * @param certificateTemplateVo
     * @return
     */
    @Override
    public int addCertificateTemplate(CertificateTemplateVo certificateTemplateVo) {
        CertificateTemplate certificateTemplate = new CertificateTemplate();
        BeanUtils.copyProperties(certificateTemplateVo,certificateTemplate);
        certificateTemplate.setCertificateTemplateId(String.valueOf(snowflakeIdUtils.nextId()));
        certificateTemplate.setCreatedBy(SecurityUtils.getUsername());
        certificateTemplate.setCreatedTime(DateUtils.getNowDate());
        Projects projects = projectsMapper.selectProjectsByProjectId(certificateTemplate.getTrainingProjectId());
        if (StringUtils.isNotNull(projects)){
            certificateTemplate.setTrainingProjectName(projects.getProjectName());
        }
        if (StringUtils.isNotEmpty(certificateTemplateVo.getCertificateFieldList())){
            List<CertificateField> certificateFieldList = certificateTemplateVo.getCertificateFieldList().stream().map(certificateField -> {
                certificateField.setCertificateFieldId(String.valueOf(snowflakeIdUtils.nextId()));
                certificateField.setTemplateId(certificateTemplate.getCertificateTemplateId());
                certificateField.setCreatedBy(SecurityUtils.getUsername());
                certificateField.setCreatedTime(DateUtils.getNowDate());
                return certificateField;
            }).collect(Collectors.toList());
            // 批量插入
            certificateFieldMapper.insertCertificateFieldBatch(certificateFieldList);
        }
        return certificateTemplateMapper.insertCertificateTemplate(certificateTemplate);
    }

    /**
     * 修改证书模板
     *
     * @param certificateTemplateVo
     * @return
     */
    @Override
    public int editCertificateTemplate(CertificateTemplateVo certificateTemplateVo) {
        CertificateTemplate certificateTemplate = new CertificateTemplate();
        BeanUtils.copyProperties(certificateTemplateVo,certificateTemplate);
        if (StringUtils.isNotEmpty(certificateTemplateVo.getCertificateFieldList())){
            certificateFieldMapper.deleteCertificateFieldByTemplateId(certificateTemplate.getCertificateTemplateId());
            List<CertificateField> certificateFieldList = certificateTemplateVo.getCertificateFieldList().stream().map(certificateField -> {
                certificateField.setCertificateFieldId(String.valueOf(snowflakeIdUtils.nextId()));
                certificateField.setTemplateId(certificateTemplate.getCertificateTemplateId());
                certificateField.setCreatedBy(SecurityUtils.getUsername());
                certificateField.setCreatedTime(DateUtils.getNowDate());
                return certificateField;
            }).collect(Collectors.toList());
            certificateFieldMapper.insertCertificateFieldBatch(certificateFieldList);
        }
        certificateTemplate.setUpdatedBy(SecurityUtils.getUsername());
        certificateTemplate.setUpdatedTime(DateUtils.getNowDate());
        return certificateTemplateMapper.updateCertificateTemplate(certificateTemplate);
    }

    /**
     * 获取证书模板信息
     *
     * @param certificateTemplateId
     * @return
     */
    @Override
    public CertificateTemplateDto getCertificateTemplateInfo(String certificateTemplateId) {
        CertificateTemplate certificateTemplate = certificateTemplateMapper.selectCertificateTemplateByCertificateTemplateId(certificateTemplateId);
        List<CertificateField> certificateFields = certificateFieldMapper.selectCertificateFieldByCertificateTemplateId(certificateTemplateId);
        CertificateTemplateDto certificateTemplateDto = new CertificateTemplateDto();
        BeanUtils.copyProperties(certificateTemplate, certificateTemplateDto);
        certificateTemplateDto.setCertificateFieldList(certificateFields);
        return certificateTemplateDto;
    }

    /**
     * 复制模板
     *
     * @param certificateTemplateId
     * @return
     */
    @Override
    public int copyCertificateTemplate(String certificateTemplateId) {
        CertificateTemplate certificateTemplate = certificateTemplateMapper.selectCertificateTemplateByCertificateTemplateId(certificateTemplateId);
        CertificateTemplate certificateTemplateCopy = new CertificateTemplate();
        BeanUtils.copyProperties(certificateTemplate, certificateTemplateCopy);
        certificateTemplateCopy.setCertificateTemplateId(String.valueOf(snowflakeIdUtils.nextId()));
        certificateTemplateCopy.setCreatedBy(SecurityUtils.getUsername());
        certificateTemplateCopy.setCreatedTime(DateUtils.getNowDate());
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String timestamp = sdf.format(new Date());
        certificateTemplateCopy.setCertificateTemplateName(certificateTemplate.getCertificateTemplateName() + "副本" + timestamp);
        List<CertificateField> certificateFields = certificateFieldMapper.selectCertificateFieldByCertificateTemplateId(certificateTemplateId);
        for (CertificateField certificateField : certificateFields) {
            certificateField.setCertificateFieldId(String.valueOf(snowflakeIdUtils.nextId()));
            certificateField.setTemplateId(certificateTemplateCopy.getCertificateTemplateId());
        }
        certificateFieldMapper.insertCertificateFieldBatch(certificateFields);
        return certificateTemplateMapper.insertCertificateTemplate(certificateTemplateCopy);
    }
}
